在行動應用程式開發中,資料的存取與儲存是核心功能之一。無論是應用程式設定、用戶資料,還是更為複雜的數據庫操作,如何有效地管理和存儲這些資料直接影響應用程式的性能和用戶體驗。本章將探討如何在 B4A 中使用 SharedPreferences、讀寫本地檔案,並進行簡單的 SQLite 資料庫操作。
SharedPreferences 是 Android 提供的一種輕量級資料存儲方式,主要用於保存少量的設定或狀態資訊,例如用戶偏好設定、應用程式的最後狀態等。這種資料存儲方式適合存儲簡單的鍵值對。
Sub SavePreferences
Dim prefs As SharedPreferences
prefs.Initialize("UserSettings")
prefs.PutString("username", "JohnDoe")
prefs.PutInt("age", 30)
prefs.PutBoolean("isLoggedIn", True)
prefs.Save
End Sub
在這個範例中,我們將用戶名、年齡和登入狀態存儲到 SharedPreferences 中。Save 方法用來將這些更改持久化到存儲中。
2. 讀取資料
要讀取 SharedPreferences 中保存的資料,可以使用 GetString、GetInt 等方法。
Sub LoadPreferences
Dim prefs As SharedPreferences
prefs.Initialize("UserSettings")
Dim username As String = prefs.GetString("username", "DefaultUser")
Dim age As Int = prefs.GetInt("age", 0)
Dim isLoggedIn As Boolean = prefs.GetBoolean("isLoggedIn", False)
Log("Username: " & username)
Log("Age: " & age)
Log("Is Logged In: " & isLoggedIn)
End Sub
這個範例從 SharedPreferences 中讀取之前保存的用戶資料,如果資料不存在,則返回預設值。
在某些情況下,應用程式可能需要存取更大且結構更複雜的資料,這時可以使用本地檔案進行資料存取。B4A 提供了簡單的檔案操作方法來讀寫本地檔案。
Sub WriteToFile
Dim fileName As String = "user_data.txt"
Dim dir As String = File.DirInternal
Dim data As String = "Name: John Doe" & CRLF & "Age: 30" & CRLF & "IsLoggedIn: True"
File.WriteString(dir, fileName, data)
Log("Data written to file: " & fileName)
End Sub
在這個範例中,我們將一段文字資料寫入到應用程式內部存儲中的 user_data.txt 檔案中。File.DirInternal 是應用程式的內部存儲目錄,這些檔案對其他應用程式不可見。
2. 讀取檔案
讀取本地檔案的過程與寫入檔案相似,可以使用 File.ReadString 方法來讀取文字檔案的內容。
Sub ReadFromFile
Dim fileName As String = "user_data.txt"
Dim dir As String = File.DirInternal
If File.Exists(dir, fileName) Then
Dim data As String = File.ReadString(dir, fileName)
Log("Data read from file: " & data)
Else
Log("File does not exist: " & fileName)
End If
End Sub
這個範例展示了如何讀取之前寫入的檔案資料,並將內容記錄在日誌中。如果檔案不存在,系統會提示相應的訊息。
3. 處理二進制檔案
除了文本檔案,B4A 也支援二進制檔案的讀寫操作,這對於存儲圖片、音頻等非文本資料非常有用。
Sub WriteBinaryFile
Dim fileName As String = "image.png"
Dim dir As String = File.DirInternal
Dim data() As Byte ' 假設這是二進制數據
File.WriteBytes(dir, fileName, data)
Log("Binary data written to file: " & fileName)
End Sub
Sub ReadBinaryFile
Dim fileName As String = "image.png"
Dim dir As String = File.DirInternal
If File.Exists(dir, fileName) Then
Dim data() As Byte = File.ReadBytes(dir, fileName)
Log("Binary data read from file: " & fileName)
Else
Log("File does not exist: " & fileName)
End If
End Sub
在這個範例中,我們演示了如何寫入和讀取二進制檔案,這對於需要處理多媒體資料的應用程式特別有用。
當需要處理結構化且大量的資料時,SQLite 是一個輕量級且高效的嵌入式資料庫解決方案。在 B4A 中,SQLite 操作相對簡單且易於上手。
Sub CreateDatabase
Dim sql As SQL
sql.Initialize(File.DirInternal, "user_data.db", True)
Dim createTable As String
createTable = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, username TEXT, age INTEGER)"
sql.ExecNonQuery(createTable)
Log("Database and table created.")
End Sub
這段程式碼會在應用程式內部存儲中建立一個名為 user_data.db 的 SQLite 資料庫,並在其中創建一個 users 資料表。
2. 插入資料
創建資料表後,你可以插入資料到資料庫中。
Sub InsertData
Dim sql As SQL
sql.Initialize(File.DirInternal, "user_data.db", True)
Dim username As String = "JohnDoe"
Dim age As Int = 30
Dim insertQuery As String
insertQuery = "INSERT INTO users (username, age) VALUES (?, ?)"
sql.ExecNonQuery2(insertQuery, Array As Object(username, age))
Log("Data inserted.")
End Sub
這段程式碼演示了如何使用 SQL 插入語句將資料插入到 users 資料表中。
3. 查詢資料
要從資料庫中檢索資料,可以使用 SQL 查詢語句。
Sub QueryData
Dim sql As SQL
sql.Initialize(File.DirInternal, "user_data.db", True)
Dim query As String
query = "SELECT * FROM users"
Dim cursor As Cursor
cursor = sql.ExecQuery(query)
For i = 0 To cursor.RowCount - 1
cursor.Position = i
Dim id As Int = cursor.GetInt("id")
Dim username As String = cursor.GetString("username")
Dim age As Int = cursor.GetInt("age")
Log("ID: " & id & ", Username: " & username & ", Age: " & age)
Next
cursor.Close
End Sub
在這個範例中,我們查詢 users 資料表中的所有記錄,並將結果輸出到日誌中。
4. 更新與刪除資料
除了插入和查詢,你還可以更新和刪除資料。
Sub UpdateData
Dim sql As SQL
sql.Initialize(File.DirInternal, "user_data.db", True)
Dim updateQuery As String
updateQuery = "UPDATE users SET age = ? WHERE username = ?"
sql.ExecNonQuery2(updateQuery, Array As Object(35, "JohnDoe"))
Log("Data updated.")
End Sub
Sub DeleteData
Dim sql As SQL
sql.Initialize(File.DirInternal, "user_data.db", True)
Dim deleteQuery As String
deleteQuery = "DELETE FROM users WHERE username = ?"
sql.ExecNonQuery2(deleteQuery, Array As Object("JohnDoe"))
Log("Data deleted.")
End Sub
這些範例展示了如何使用 SQL 語句更新和刪除資料,這在資料維護和管理中非常常見。
以下是一個綜合範例,展示了如何將 SharedPreferences、本地檔案和 SQLite 資料庫操作整合到一個簡單的應用程式中。
Sub Process_Globals
' 全域變數
End Sub
Sub Globals
Dim btnSavePrefs As Button
Dim btnLoadPrefs As Button
Dim btnWriteFile As Button
Dim btnReadFile As Button
Dim btnInsertDB As Button
Dim btnQueryDB As Button
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("MainLayout")
btnSavePrefs.Text = "保存偏好設定"
btnLoadPrefs.Text = "載入偏好設定"
btnWriteFile.Text = "寫入檔案"
btnReadFile.Text = "讀取檔案"
btnInsertDB.Text = "插入資料庫"
btnQueryDB.Text = "查詢資料庫"
CreateDatabase
End Sub
Sub btnSavePrefs_Click
SavePreferences
End Sub
Sub btnLoadPrefs_Click
LoadPreferences
End Sub
Sub btnWriteFile_Click
WriteToFile
End Sub
Sub btnReadFile_Click
ReadFromFile
End Sub
Sub btnInsertDB_Click
InsertData
End Sub
Sub btnQueryDB_Click
QueryData
End Sub
這個範例將各種資料存取和儲存操作整合到一個簡單的介面中,使得應用程式能夠保存和檢索用戶設定、處理本地檔案,以及管理 SQLite 資料庫中的數據。通過這些技術,開發者可以有效地處理應用程式中的資料,從而提升應用程式的功能性和用戶體驗。
參考網址
• B4X SQLite Database https://www.b4x.com/guides/B4XSQLiteDatabase.html